loop/recur এর মাধ্যমে Tail-Recursive Looping

Computer Programming - ক্লোজার (Clojure) Looping এবং Iteration (Looping and Iteration) |
208
208

loop/recur এর মাধ্যমে Tail-Recursive Looping

ক্লোজারে (Clojure) tail-recursive looping বাস্তবায়ন করার জন্য loop এবং recur ব্যবহার করা হয়। এই দুটি ফাংশন একসাথে কাজ করে এবং tail recursion এর সুবিধা প্রদান করে, যেখানে রিকার্সিভ কলের শেষ অংশে কোনো অতিরিক্ত কাজ থাকে না, ফলে মেমোরি ব্যবহার সাশ্রয়ী হয় এবং স্ট্যাক ওভারফ্লো এর ঝুঁকি কমে।

loop/recur কী?

  1. loop: এটি একটি লুপের মতো ব্যবহৃত হয়, যা নির্দিষ্ট সংখ্যা বা শর্ত পূর্ণ না হওয়া পর্যন্ত পুনরাবৃত্তি করতে সাহায্য করে। এটি চলতে থাকা প্রোগ্রাম কনট্রোলের জন্য কিছু স্থির মান বা অবস্থান নির্ধারণ করে।
  2. recur: এটি loop বা রিকার্সিভ ফাংশনের মধ্যে নিজেকে পুনরায় কল করতে ব্যবহৃত হয়। এটি স্ট্যাক ওভারফ্লো সমস্যা ছাড়া কার্যকরীভাবে টেইল রিকার্সন তৈরি করতে সাহায্য করে, কারণ recur কোনো নতুন স্ট্যাক ফ্রেম তৈরি না করে বর্তমান ফ্রেমে কাজ চালিয়ে যায়।

loop এবং recur এর মাধ্যমে Tail-Recursive Looping উদাহরণ

উদাহরণ: ফ্যাক্টরিয়াল গণনা

(defn factorial [n]
  (loop [acc 1
         num n]
    (if (<= num 1)
      acc
      (recur (* acc num) (dec num)))))

এখানে loop দিয়ে একটি লুপ শুরু করা হয়েছে এবং recur এর মাধ্যমে ফাংশনকে আবার কল করা হয়েছে, কিন্তু কোনো নতুন স্ট্যাক ফ্রেম তৈরি না করে। acc একটি অ্যাকিউমুলেটর (accumulator) হিসেবে কাজ করছে, যা ফ্যাক্টরিয়াল গণনার জন্য আগের ফলাফলের সাথে বর্তমান মানকে গুণ করছে। এইভাবে, শেষের রিকার্সন কলের পর কোনো অতিরিক্ত কাজ হয় না, এবং মেমোরি ব্যবহার দক্ষ থাকে।

ব্যাখ্যা:

  1. loop এর মধ্যে acc এবং num নামের দুটি ভ্যারিয়েবল নির্ধারণ করা হয়েছে। acc হচ্ছে ফ্যাক্টরিয়াল গণনার জন্য ইনিশিয়াল মান, এবং num হচ্ছে ডেটার বর্তমান মান।
  2. শর্ত (<= num 1) চেক করা হচ্ছে, যদি num 1 এর সমান বা ছোট হয়, তবে acc রিটার্ন করা হবে, অন্যথায় recur দিয়ে পুনরায় কল করা হবে।
  3. recur পরবর্তী রিকার্সন কলের জন্য অ্যাকিউমুলেটর acc আপডেট করে এবং num এর মান 1 কমায়। এতে কোনো নতুন স্ট্যাক ফ্রেম তৈরি হয় না এবং এই কল বর্তমান ফ্রেমে সম্পন্ন হয়।

উদাহরণ: ফিবোনাচি সিরিজ

(defn fibonacci [n]
  (loop [a 0
         b 1
         count n]
    (if (<= count 0)
      a
      (recur b (+ a b) (dec count)))))

এখানে loop এবং recur এর মাধ্যমে ফিবোনাচি সিরিজ গণনা করা হচ্ছে। a এবং b ফিবোনাচি সিরিজের আগের দুটি মান, এবং count হলো ফিবোনাচি সংখ্যার অবস্থান।

ব্যাখ্যা:

  1. loop-এ তিনটি ভ্যারিয়েবল: a, b, এবং count ব্যবহৃত হচ্ছে। a এবং b ফিবোনাচি সিরিজের দুটি আগের মান, এবং count বাকি পদ সংখ্যা।
  2. শর্ত (<= count 0) চেক করা হয়, যদি count 0 বা তার চেয়ে ছোট হয়, তখন a রিটার্ন করা হয়, যা ফিবোনাচি সংখ্যার মান।
  3. recur পরবর্তী রিকার্সন কলের জন্য a এবং b এর মান আপডেট করে, এবং count এর মান 1 কমায়।

loop/recur এর সুবিধা

  1. মেমোরি দক্ষতা: recur এর মাধ্যমে কোনো নতুন স্ট্যাক ফ্রেম তৈরি না হওয়ায়, মেমোরি ব্যবহারের সমস্যা যেমন স্ট্যাক ওভারফ্লো এড়ানো যায়।
  2. স্ট্যাক ওভারফ্লো থেকে মুক্তি: রিকার্সন সাধারণত গভীর স্ট্যাক ফ্রেম তৈরি করতে পারে, কিন্তু loop এবং recur এর মাধ্যমে তা কমিয়ে দেয়।
  3. পুনঃব্যবহারযোগ্য কোড: এই কৌশলটি ফাংশনাল প্রোগ্রামিংয়ে কোড পুনঃব্যবহারযোগ্য এবং আরও কার্যকরী করে তোলে।

সারসংক্ষেপ

বৈশিষ্ট্যloop/recurসাধারণ রিকার্সন
স্ট্যাক ব্যবস্থাপনাস্ট্যাক ফ্রেম পুনঃব্যবহার করেপ্রতিটি রিকার্সন কল নতুন স্ট্যাক ফ্রেম তৈরি করে
কার্যক্ষমতামেমোরি সাশ্রয়ী এবং কার্যকরগভীর রিকার্সনে স্ট্যাক ওভারফ্লো হতে পারে
বৈশিষ্ট্যটেইল রিকার্সন, মেমোরি দক্ষস্ট্যাক ওভারফ্লো ঝুঁকি এবং কম কার্যক্ষম

ক্লোজারে loop এবং recur ব্যবহার করে tail-recursive looping একটি শক্তিশালী কৌশল, যা মেমোরি ব্যবহার সাশ্রয়ী এবং কার্যক্ষমভাবে পুনরাবৃত্তি সম্পাদন করতে সাহায্য করে।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion